package ginx

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"webook/pkg/logx"
)

// L 日志对象包变量
var L logx.LoggerX

// WrapperBody 装饰Body
func WrapperBody[Req any](fn func(*gin.Context, Req) (Result[any], error)) gin.HandlerFunc {
	return func(ctx *gin.Context) {
		// 1. 绑定请求体参数
		var req Req
		if err := ctx.Bind(&req); err != nil {
			L.Error("绑定Body参数异常!")
			return
		}
		// 2. 业务逻辑处理
		res, err := fn(ctx, req)
		// 3. 错误日志处理
		if err != nil {
			// 记录日志
			L.Error("业务逻辑处理异常!",
				logx.String("path", ctx.Request.URL.Path),
				logx.Error(err))
			ctx.JSON(http.StatusOK, res)
			return
		}
		ctx.JSON(http.StatusOK, res)
	}
}

// Result 统一返回对象
type Result[T any] struct {
	Code int    `json:"code"`
	Data T      `json:"data"`
	Msg  string `json:"msg"`
}
